from django.shortcuts import render, redirect, HttpResponse
from app02 import models  # 引入表
from app02.utils.pegination import Pegination
from app02.utils.bootrsap import BootrsapModelForm
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError


# 靓号管理
def pttary_list(request):
    # 靓号列表
    # for i in range(300):
    #     models.LiangInfo.objects.create(mobile='18176863795',price=50,level=1,status=2)
    # 创建一个空数组 当用户输入为空时 输出全部表单
    data_list = {}
    # 获取表单提交的数据 当用户没有输入q值时 输入框为空
    seach_data = request.GET.get( 'q', '' )
    # value==true  mobile__contains包含value值
    if seach_data:
        data_list['mobile__contains'] = seach_data

    # 分页 [0:30]
    # select * from 表 orbay by
    # order_by 排序的意思  -level 降序  默认是升序
    mun = models.LiangInfo.objects.filter( **data_list ).order_by( '-level' )
    page_object = Pegination( request, mun )
    page_mun = page_object.page_mun  # 当前页要显示的数据  mun[起始，结束]
    page_string = page_object.html()  # 接收到函数返回的page_string

    coxtent = {
               'mun': page_mun,  # 分完页的数据
               'seach_data': seach_data,  # 页码
               'page_string': page_string
               }
    return render( request, 'pttary_list.html', coxtent )


# 新建靓号
# 创建ModelForm表单
class pttaryModelForm( BootrsapModelForm ):
    # # 验证方式1
    # mobile=forms.CharField(
    #     label='手机号',
    #     validators=[RegexValidator(r'^1[3-9]\d{9}$','手机号码输入错误')]
    # )
    class Meta:
        model = models.LiangInfo
        fields = '__all__'

    # 验证方式2(钩子方法)
    def clean_mobile(self):
        # 获取用户输入的值
        txt_mobile = self.cleaned_data['mobile']
        # 在数据库中寻找有没有跟用户输入的一样的
        exists = models.LiangInfo.objects.filter( mobile=txt_mobile ).exists()
        # 判断输入是否符合
        if exists:
            # 验证不通过
            raise ValidationError( '手机号已存在' )
        # 验证通过 将用户输入的值返回
        return txt_mobile


# 靓号列表
def pttary_add(request):
    if request.method == 'GET':
        form = pttaryModelForm()

        return render( request, 'pttary_add.html', {'form': form} )
    else:
        # 获取到用户发送的post请求 得到数据
        form = pttaryModelForm( data=request.POST )
        # 验证表单
        if form.is_valid():
            # 提交数据给数据库
            form.save()
            return redirect( '/pttary/list/' )
        return render( request, 'pttary_add.html', {'form': form} )


# 创建编辑的ModelForm表单
class pttaryEditModelForm( BootrsapModelForm ):
    class Meta:
        model = models.LiangInfo
        fields = ['mobile', 'price', 'level', 'status']

    # 验证方式2(钩子方法)
    def clean_mobile(self):
        # 获取用户输入的值
        txt_mobile = self.cleaned_data['mobile']
        # 获取对应那一行的id self.instance.pk
        print( self.instance.pk )
        # 在数据库中寻找有没有跟用户输入的一样的
        # .exclude(id=self.instance.pk)  意思就是让id不等于对应行id
        exists = models.LiangInfo.objects.exclude( id=self.instance.pk ).filter( mobile=txt_mobile ).exists()
        print( exists )  # false
        # 判断输入是否符合
        if exists:
            # 验证不通过
            print( 'hello' )
            raise ValidationError( '手机号已存在' )
        # 验证通过 将用户输入的值返回
        return txt_mobile


# 编辑靓号
def pttary_edit(request, uid):
    # 根据id 获取对应哪一行的数据
    row_i = models.LiangInfo.objects.filter( id=uid ).first()
    if request.method == 'GET':
        # 将表中每一行数据 传给页面
        form = pttaryEditModelForm( instance=row_i )
        return render( request, 'pttary_edit.html', {'form': form} )
    else:
        form = pttaryEditModelForm( data=request.POST, instance=row_i )
        # 验证表单
        if form.is_valid():
            # 自动保存到数据库
            form.save()
            return redirect( '/pttary/list/' )
        # 验证失败 返回编辑页面
        return render( request, 'pttary_edit.html', {'form': form} )


# 删除靓号
def pttary_delete(request, uid):
    # 根据id删除数据库中对于的那一列
    models.LiangInfo.objects.filter( id=uid ).delete()
    # 回到页面
    return redirect( '/pttary/list/' )
